﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../macro/head.h"
#include "../xos/head.h"
#include "hook.h"
#include "mgr.h"

namespace xos_container
{
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static mgr * container_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr()
    {}

    mgr::~mgr()
    {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( i_container ** ppv )
    {
        int ret = 0;

        mgr::T * pObj = 0;

        if( ( 0 == ret ) && container_ptr )
        {
            ret = 1;
        }

        if( 0 == ret )
        {
            pObj = new mgr::T;
            if( pObj )
            {
                container_ptr = pObj;
            }
            else
            {
                ret = 1;
            }
        }

        if( 0 == ret )
        {
            ret = pObj->init();
        }

        if( 0 != ret )
        {
            container_ptr = 0;
        }
        else
        {
            *ppv = pObj;
            pObj = 0;
        }

        xos_stl::release_interface( pObj );

        return ret;
    }

    mgr * mgr::get()
    {
        return container_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // return obj
    // 
    xos_aio::i_aio_mgr * mgr::aio()
    {
        return aio::get();
    }

    xos_common::i_common * mgr::common()
    {
        return common::get();
    }

    xos_compress::i_compress_mgr * mgr::compress()
    {
        return compress::get();
    }

    xos::i_xos * mgr::xos()
    {
        return core::get();
    }

    xos_curl::i_curl_mgr * mgr::curl()
    {
        return curl::get();
    }

    xos_encrypt::i_encrypt_mgr * mgr::encrypt()
    {
        return encrypt::get();
    }

    xos_http::i_http_mgr * mgr::http()
    {
        return http::get();
    }

    xos_json::i_json_mgr * mgr::json()
    {
        return json::get();
    }

    xos_log::i_log * mgr::log()
    {
        return log::get();
    }

    xos_box::i_box_mgr * mgr::box()
    {
        return box::get();
    }

    xos_odbc::i_odbc_mgr * mgr::odbc()
    {
        return odbc::get();
    }

    xos_package::i_package_mgr * mgr::package()
    {
        return package::get();
    }

    xos_sqlite::i_sqlite_mgr * mgr::sqlite()
    {
        return sqlite::get();
    }

    xos_xml::i_xml_mgr * mgr::xml()
    {
        return xml::get();
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // need release
    // 
    xos_box::i_big_buf * mgr::big_buf()
    {
        return box::big_buf();
    }

    xos_box::i_buf * mgr::buf()
    {
        return box::buf();
    }

    xos_box::i_msg * mgr::msg()
    {
        return box::msg();
    }

    xos_box::i_list * mgr::list()
    {
        return box::list();
    }

    xos_box::i_property * mgr::prop()
    {
        return box::prop();
    }

    xos_box::i_variant * mgr::vt()
    {
        return box::vt();
    }

    xos_box::i_lock_obj * mgr::lobj()
    {
        xos_box::i_lock_obj * pRet = 0;
        box()->create( xos_box::enumObj::BOX_OBJ_LOCK_OBJ, ( void ** )&pRet );
        return pRet;
    }

    xos_box::i_lock_num * mgr::lnum()
    {
        xos_box::i_lock_num * pRet = 0;
        box()->create( xos_box::enumObj::BOX_OBJ_LOCK_NUM, ( void ** )&pRet );
        return pRet;
    }

    xos_http::i_session * mgr::session()
    {
        return http::session();
    }

    xos_http::i_cookie * mgr::cookie()
    {
        return http::cookie();
    }

    xos_common::i_md5 * mgr::md5()
    {
        return common::md5();
    }

    xos::i_lock * mgr::mutex()
    {
        xos::i_lock * pRet = 0;
        xos()->create( xos::i_xos::XOS_OBJ_MUTX_LOCK, ( void ** )&pRet );
        return pRet;
    }

    xos::i_lock * mgr::spin()
    {
        xos::i_lock * pRet = 0;
        xos()->create( xos::i_xos::XOS_OBJ_SPIN_LOCK, ( void ** )&pRet );
        return pRet;
    }

    xos::i_file * mgr::file()
    {
        xos::i_file * pRet = 0;
        xos()->create( xos::i_xos::XOS_OBJ_FILE, ( void ** )&pRet );
        return pRet;
    }

    xos::i_dir * mgr::dir()
    {
        xos::i_dir * pRet = 0;
        xos()->create( xos::i_xos::XOS_OBJ_DIR, ( void ** )&pRet );
        return pRet;
    }

    xos::i_time * mgr::tm()
    {
        return core::tm();
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // need not release
    // 
    xos_common::i_misc * mgr::common_misc()
    {
        return common::misc();
    }

    xos_box::i_serial * mgr::serial()
    {
        return box::serial();
    }

    xos_box::i_heart * mgr::heart()
    {
        return box::heart();
    }

    xos::i_misc * mgr::misc()
    {
        return core::misc();
    }

    xos::i_crt * mgr::crt()
    {
        return core::crt();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // helper
    // 
    const char * mgr::exe_path()
    {
        return core::exe_path();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool( T * pT, bool bLock )
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            ret = hook::init();
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;

        hook::term();

        return ret;
    }

} // xos_container
